#ifndef _TOOLS_PID_H_
#define _TOOLS_PID_H_

typedef float (*pid_digit_filter_func)(float input);

typedef struct pid_control
{
    float kp;                     /* 比例系数 */
    float ki;                     /* 积分系数 */
    float kd;                     /* 微分系数 */
    float last_error;             /* 上次偏差量 */
    float integral_sum;           /* 积分项累加和 */
    float integral_sum_min;       /* 积分项最小值（负值） */
    float integral_sum_max;       /* 积分项最大值（正值） */
    float output_min;             /* 输出量最小值 */
    float output_max;             /* 输出量最大值 */
    pid_digit_filter_func filter; /* 滤波器 */
} pid_control_t;

/// @brief 计算PD控制的控制量
/// @param pid pid控制参数
/// @param error 误差
/// @return 输出控制量
float pd_calc(pid_control_t *pid, float error);

/// @brief 计算PI控制的控制量
/// @param pid pid控制参数
/// @param error 误差
/// @return 输出控制量
float pi_calc(pid_control_t *pid, float error);

/// @brief 计算PID控制量
/// @param pid_params pid控制参数
/// @param error 误差
/// @return 输出控制量
float pid_calc(pid_control_t *pid_params, float error);

#endif